package music.listener; /**
 * Created by pc01 on 10/29/2014.
 */

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

@WebListener()
public class MVCStartupListener implements ServletContextListener{

        private static Map<String, Object> handlerMap = new HashMap<String, Object>();


        public static Map<String, Object> getHandlerMap() {
            return handlerMap;
        }


    public void contextInitialized(ServletContextEvent sce) {

        String mvcConfig = "/WEB-INF/mvc.properties";
        Properties p = new Properties();
        FileInputStream fis = null;

        System.out.println("MVC setup starting...");

        // WEB-INF/mvc.properties에 key=value 형태로 저장된
        // URL(액션 이름)과 그것과 관련된 핸들러클래스 정보를 읽어서
        // key와 value를 각각 분리해서 properties 객체에 저장


        try {
            String cfgPath = sce.getServletContext()
                    .getRealPath( mvcConfig );
            // mvc2.properties 파일의 전체경로를 알아냄

            fis = new FileInputStream( cfgPath );
            // 알아낸 경로상의 mvc2.properties 파일의 내용을 알기위해
            // FileInputStream으로 초기화 시킴

            p.load(fis);
            // Property 클래스를 이용해서 mvc2.properties 파일의 내용을
            // key, value로 분리해서 Property 형식으로 저장함.

        } catch (Exception ex) {
            System.out.println("properties 파일 처리중 오류!");
            ex.printStackTrace();
        } finally {
            if ( fis != null ) try { fis.close();} catch(Exception e){}
        }

        // properties 객체에 저장된 url(액션이름)과 핸들러클래스 객체를
        // 지어 HashMap 객체에 저장함

        Iterator<Object> iter = p.keySet().iterator();
        // Property 객체에 저장된 정보를 key 기준으로 하나씩 꺼내 조회할 수 있도록
        // Iterator 객체에 저장

        while (iter.hasNext()) {
            // Iterator에서 꺼낼 정보가 있다면

            String action = (String) iter.next();
            // Iterator에서 key(url) 값을 꺼내고
            String handlerName = p.getProperty(action);
            // key와 연관된 클래스 정보를 property에서 조회

            try {
                Class<?> handlerClass = Class.forName(handlerName);

                // property에서 조회한 클래스정보를 기반으로 클래스를 초기화하고
                Object handlerInstance = handlerClass.newInstance();
                // newInstance 메서드로 해당 클래스의 실제 객체를 생성

                handlerMap.put(action, handlerInstance);
                // 생성된 클래스 객체는 key(url)와 함께 hashmap에 저장



                // MemberVO mvo = new MemberVO();
                // handlerMap.put(action, mvo);

                // IndexHandler index = new IndexHandler();
                // handlerMap.put(action, index);

                // JoinHandler join = new JoinHandler();
                // handlerMap.put(action, join);

                // ListHandler list = new ListHandler();
                // handlerMap.put(action, list);

            } catch (Exception ex) {
                System.out.println("액션클래스 초기화에서 오류");
                ex.printStackTrace();
                return;
            }//try
        }//while
        System.out.println("MVC setup successfully!");

    }

    public void contextDestroyed(ServletContextEvent sce) {

    }

}
